package leetcode101.data_structure;

/**
 * @author Synhard
 * @version 1.0
 * @class Code3
 * @description 240. 搜索二维矩阵 II
 * 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性：
 *
 * 每行的元素从左到右升序排列。
 * 每列的元素从上到下升序排列。
 *  
 *
 * 示例 1：
 *
 *
 * 输入：matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 5
 * 输出：true
 * 示例 2：
 *
 *
 * 输入：matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 20
 * 输出：false
 *
 * @tel 13001321080
 * @email 823436512@qq.com
 * @date 2021-05-09 9:11
 */
public class Code3 {
    public static void main(String[] args) {

    }

    public boolean searchMatrix(int[][] matrix, int target) {
        int m = matrix.length;
        int n = matrix[0].length;
        boolean flag = false;
        for (int i = 0; i < m; i++) {
            if (matrix[i][n - 1] == target) {
                return true;
            }
            if (matrix[i][n - 1] > target) {
                flag = binarySearch(matrix[i], target);
            }
            if (flag) {
                return true;
            }
        }
        return false;
    }

    public boolean binarySearch(int[] arr, int target) {
        int low = -1, high = arr.length, mid;
        while (low + 1 != high) {
            mid = (low + high) >> 1;
            if (arr[mid] < target) {
                low = mid;
            } else if (arr[mid] > target) {
                high = mid;
            } else {
                return true;
            }
        }
        return false;
    }

}

/*
从每一行的最后一个元素开始找
确定可能出现的行之后对每一行进行二分查找就行了
不会吧不会吧
不会有人二分查找都不会吧
 */